#!/bin/bash

# 检查是否已经source过该文件
if [ -n "$WEBSERVER_ENV_SOURCED" ]; then
    echo "环境变量已经设置，重新加载中..."
fi

# 获取脚本所在目录的绝对路径
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
FLUTTER_DIR="${SCRIPT_DIR}/prebuilt/flutter_flutter"

# 检查 flutter_flutter 目录是否存在
if [ ! -d "$FLUTTER_DIR" ]; then
    echo "错误：flutter_flutter 目录不存在，请先运行 prebuilt/download_flutter.sh 下载 Flutter。"
    return 1
fi

# 设置安装目录
# 如果环境变量已经设置，则使用已有的值，否则使用默认值
if [ -z "$WEBSERVER_INSTALL_DIR" ]; then
    # 默认使用 /opt/webserver，如果没有写权限则使用用户主目录下的 .webserver
    WEBSERVER_INSTALL_DIR="${SCRIPT_DIR}/build/out/target/usr"
fi

# 确保安装目录存在
if [ ! -d "$WEBSERVER_INSTALL_DIR" ]; then
    echo "创建安装目录: $WEBSERVER_INSTALL_DIR"
    mkdir -p "$WEBSERVER_INSTALL_DIR"
    if [ $? -ne 0 ]; then
        echo "错误：无法创建安装目录 $WEBSERVER_INSTALL_DIR，请检查权限或手动创建。"
        return 1
    fi
fi

# 设置环境变量，避免重复添加PATH
export FLUTTER_ROOT="$FLUTTER_DIR"
export WEBSERVER_INSTALL_DIR="$WEBSERVER_INSTALL_DIR"

# 检查PATH中是否已包含Flutter bin目录，如果没有则添加
if [[ ":$PATH:" != *":$FLUTTER_DIR/bin:"* ]]; then
    export PATH="$FLUTTER_DIR/bin:$PATH"
    echo "PATH 已更新，已添加：$FLUTTER_DIR/bin"
else
    echo "PATH 中已包含 Flutter bin 目录，无需更新"
fi

# 设置标志变量，表示已经source过该文件
export WEBSERVER_ENV_SOURCED=1

echo "环境变量设置完成："
echo "FLUTTER_ROOT = $FLUTTER_ROOT"
echo "WEBSERVER_INSTALL_DIR = $WEBSERVER_INSTALL_DIR"
echo "可用命令："
echo "  meprebuild        - 进入prebuilt目录执行make（编译apr和apr-util）"
echo "  mebuild           - 执行cmake、make和make install（需要先执行meprebuild）"
echo "  mepack            - 打包webserver到tar.gz压缩包（格式：webserver_时间戳.tar.gz）"
echo "  meinstall         - 安装最新的webserver压缩包到/opt目录（会自动请求sudo权限）"
echo "  meclean           - 进入build目录执行make clean"

# 如果是重新source，输出函数重新定义信息
if [ -n "$WEBSERVER_ENV_SOURCED" ]; then
    echo "重新定义meprebuild、mebuild和mepack函数..."
fi

# meprebuild函数：进入prebuilt目录执行make，编译apr和apr-util
meprebuild() {
    # 保存当前目录
    local CURRENT_DIR=$(pwd)
    
    # 进入prebuilt目录
    echo "进入prebuilt目录..."
    cd "${SCRIPT_DIR}/prebuilt"
    
    # 执行make
    echo "执行make，编译apr和apr-util..."
    make
    if [ $? -ne 0 ]; then
        echo "错误：prebuilt编译失败。"
        cd "$CURRENT_DIR"  # 返回原目录
        return 1
    fi
    
    # 返回原目录
    echo "预构建完成，返回原目录..."
    cd "$CURRENT_DIR"
    
    # 标记已执行meprebuild
    export WEBSERVER_PREBUILD_DONE=1
    
    echo "预构建成功完成！"
    return 0
}

# mebuild函数：进入build文件夹，执行cmake、make和make install，然后返回根目录
mebuild() {
    # 检查是否已执行meprebuild
    if [ -z "$WEBSERVER_PREBUILD_DONE" ]; then
        echo "警告：如果之前没有执行过meprebuild，请先执行meprebuild命令！"
    fi
    
    # 保存当前目录
    local CURRENT_DIR=$(pwd)
    
    # 检查build目录是否存在，如果不存在则创建
    if [ ! -d "${SCRIPT_DIR}/build" ]; then
        echo "创建build目录..."
        mkdir -p "${SCRIPT_DIR}/build"
        if [ $? -ne 0 ]; then
            echo "错误：无法创建build目录，请检查权限。"
            return 1
        fi
    fi
    
    # 进入build目录
    echo "进入build目录..."
    cd "${SCRIPT_DIR}/build"

    # 检查out目录是否存在，如果存在则删除
    if [ -d "${SCRIPT_DIR}/build/out" ]; then
        echo "删除旧的out目录..."
        rm -rf "${SCRIPT_DIR}/build/out"
        if [ $? -ne 0 ]; then
            echo "错误：无法删除旧的out目录，请检查权限。"
            cd "$CURRENT_DIR"  # 返回原目录
            return 1
        fi
    fi
    
    # 执行cmake
    echo "执行cmake..."
    cmake ..
    if [ $? -ne 0 ]; then
        echo "错误：cmake执行失败。"
        cd "$CURRENT_DIR"  # 返回原目录
        return 1
    fi
    
    # 执行make和smarthome_web构建
    echo "执行make..."
    make
    if [ $? -ne 0 ]; then
        echo "错误：make执行失败。"
        cd "$CURRENT_DIR"  # 返回原目录
        return 1
    fi
    
    echo "执行smarthome_web构建..."
    make smarthome_web
    if [ $? -ne 0 ]; then
        echo "错误：smarthome_web构建失败。"
        cd "$CURRENT_DIR"  # 返回原目录
        return 1
    fi
    
    # 执行make install
    echo "执行make install..."
    make install
    if [ $? -ne 0 ]; then
        echo "错误：make install执行失败。"
        cd "$CURRENT_DIR"  # 返回原目录
        return 1
    fi
    
    # 返回原目录
    echo "构建完成，返回原目录..."
    cd "$CURRENT_DIR"
    
    echo "构建和安装成功完成！"
    echo "可用命令："
    echo "  mepack            - 打包webserver到tar.gz压缩包（格式：webserver_时间戳.tar.gz）"
    return 0
}

# mepack函数：打包webserver
mepack() {
    local CURRENT_DIR=$(pwd)
    local TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
    local OUT_DIR="build/out"
    local WEBSERVER_DIR="${OUT_DIR}/webserver"
    local TARGET_DIR="${OUT_DIR}/target/usr"
    local PACKAGE_NAME="webserver_${TIMESTAMP}.tar.gz"

    # 检查目标目录是否存在
    if [ ! -d "${TARGET_DIR}" ]; then
        echo "错误：${TARGET_DIR} 目录不存在。请先执行build命令。"
        return 1
    fi

    # 创建webserver目录
    echo "创建 ${WEBSERVER_DIR} 目录..."
    rm -rf "${WEBSERVER_DIR}"
    mkdir -p "${WEBSERVER_DIR}"
    if [ $? -ne 0 ]; then
        echo "错误：无法创建 ${WEBSERVER_DIR} 目录。"
        return 1
    fi

    # 复制文件
    echo "复制文件从 ${TARGET_DIR} 到 ${WEBSERVER_DIR}..."
    cp -r "${TARGET_DIR}"/* "${WEBSERVER_DIR}/"
    if [ $? -ne 0 ]; then
        echo "错误：复制文件失败。"
        return 1
    fi

    # 创建压缩包
    echo "创建压缩包 ${PACKAGE_NAME}..."
    cd "${OUT_DIR}"
    tar -czf "${PACKAGE_NAME}" webserver/
    if [ $? -ne 0 ]; then
        echo "错误：创建压缩包失败。"
        cd "${CURRENT_DIR}"
        return 1
    fi

    cd "${CURRENT_DIR}"
    echo "打包完成！压缩包位置：${OUT_DIR}/${PACKAGE_NAME}"
    echo "可用命令："
    echo "  meinstall         - 安装最新的webserver压缩包到/opt目录（会自动请求sudo权限）"
    return 0
}

# meinstall函数：删除/opt/webserver并将最新的webserver压缩包解压到/opt目录
meinstall() {
    local CURRENT_DIR=$(pwd)
    local OUT_DIR="build/out"
    local DEST_DIR="/opt"
    local WEBSERVER_DIR="${DEST_DIR}/webserver"
    
    # 查找最新的webserver压缩包
    echo "查找最新的webserver压缩包..."
    local LATEST_PACKAGE=$(find "${OUT_DIR}" -name "webserver_*.tar.gz" -type f -printf "%T@ %p\n" | sort -nr | head -1 | cut -d' ' -f2-)
    
    if [ -z "${LATEST_PACKAGE}" ]; then
        echo "错误：未找到webserver压缩包。请先执行pack命令创建压缩包。"
        return 1
    fi
    
    echo "找到最新的压缩包：${LATEST_PACKAGE}"
    
    # 创建临时安装脚本
    local TEMP_SCRIPT=$(mktemp)
    cat > "${TEMP_SCRIPT}" << EOF
#!/bin/bash
# 删除现有的webserver目录
echo "删除现有的${WEBSERVER_DIR}目录..."
if [ -d "${WEBSERVER_DIR}" ]; then
    rm -rf "${WEBSERVER_DIR}"
    if [ \$? -ne 0 ]; then
        echo "错误：无法删除${WEBSERVER_DIR}目录。"
        exit 1
    fi
fi

# 解压压缩包到/opt目录
echo "解压${LATEST_PACKAGE}到${DEST_DIR}目录..."
tar -xzf "${LATEST_PACKAGE}" -C "${DEST_DIR}"
if [ \$? -ne 0 ]; then
    echo "错误：解压失败。"
    exit 1
fi

echo "安装完成！webserver已安装到${WEBSERVER_DIR}"
exit 0
EOF
    
    # 设置脚本可执行权限
    chmod +x "${TEMP_SCRIPT}"
    
    # 使用sudo执行临时脚本
    echo "需要sudo权限来安装webserver到${DEST_DIR}目录..."
    sudo "${TEMP_SCRIPT}"
    local RESULT=$?
    
    # 删除临时脚本
    rm -f "${TEMP_SCRIPT}"
    
    return ${RESULT}
}

# meclean函数：进入build目录执行make clean和flutter-clean
meclean() {
    # 保存当前目录
    local CURRENT_DIR=$(pwd)
    
    # 检查build目录是否存在
    if [ ! -d "${SCRIPT_DIR}/build" ]; then
        echo "错误：build目录不存在，无法执行清理操作。"
        return 1
    fi
    
    # 进入build目录
    echo "进入build目录..."
    cd "${SCRIPT_DIR}/build"
    
    # 执行make clean-all（包含标准clean和flutter-clean）
    echo "执行完整清理（包括Flutter项目）..."
    make clean-all
    if [ $? -ne 0 ]; then
        echo "错误：清理操作执行失败。"
        cd "$CURRENT_DIR"  # 返回原目录
        return 1
    fi
    
    # 返回原目录
    echo "清理完成，返回原目录..."
    cd "$CURRENT_DIR"
    
    echo "清理操作执行成功！"
    return 0
}

# 导出函数，使其可在shell中使用
export -f meprebuild
export -f mebuild
export -f mepack
export -f meinstall
export -f meclean